"""
 encoding    : utf-8
 @File       : OA_tools.py
 @Author     : Rao
 @Version    :
 @Description:
 @Date       : 2024/06/14
"""
import time
import yaml
from common.get_data import *
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
from selenium import webdriver
from pathlib import Path

# todo 李龙编写工具区域
'''开始'''

'''结束'''

# todo 杨晖编写工具区域
'''开始'''

'''结束'''

# todo 秦吉伟编写工具区域
'''开始'''

'''结束'''

# todo 马志元编写工具区域
'''开始'''


class Oa_Page:
    def __init__(self, driver):
        self.driver = driver

    def open_llq(self):
        '''打开浏览器'''
        get_url = Get_Url()  # 获取网址
        url = get_url.get_url()
        self.driver.get(url[0][1])  # 输入网址
        self.driver.implicitly_wait(2)  # 隐式等待

    def login(self):
        '''登录'''
        login_data = Get_Login()
        mylist = login_data.get_by_xls()
        self.driver.find_element('name', 'loginId').send_keys(mylist[0][0])
        self.driver.find_element('name', 'password').send_keys(mylist[0][1])
        self.driver.find_element('id', 'button_submit').click()
        time.sleep(2)

    def page_refresh(self):
        get_url = Get_Url()  # 获取网址
        url = get_url.get_url()
        self.driver.get(url[1][1])

    def close_llq(self):
        '''关闭浏览器'''
        self.driver.quit()

    def release_right(self):
        ele = self.driver.find_element('css selector',
                                       '.d-content > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > '
                                       'td:nth-child(2)')
        assert ele.text == '发布成功！', '与预期结果不符合'

    def work_release_right(self):
        '''提交日志正向验证'''
        ele = self.driver.find_element('xpath',
                                       '/html/body/div[1]/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr['
                                       '2]/td/div/table/tbody/tr/td[2]')
        assert ele.text == '提交成功！', '与预期结果不符合'

    def jietu(self, num):
        '''截图'''
        self.driver.get_screenshot_as_file(rf'E:\automatic_test_oa_system\log\{num}测试截图.jpg')


'''结束'''

# todo 杨家红编写工具区域
'''开始'''

'''结束'''

# todo 饶书豪编写工具区域
'''开始'''
MARK = 'default'


class QueryFile:
    """初始化类
        功能：读取yaml配置文件,将获取到的数据传递给工具类
    """

    @staticmethod
    def find_path(file_name='data.yaml', start_dir='../data'):
        """
        查找任意文件的路径, 默认是data.yaml, 可以选择自己需要的文件

        start_dir: 开始搜索的目录，默认为None，表示从当前目录开始搜索。
        :return: 返回找到的data.yaml文件的Path对象，如果没有找到则返回None。
        """
        # if start_dir is None:
        #     start_dir = Path.cwd()  # 当前工作目录
        # else:
        start_dir = Path(start_dir).resolve()

        # 搜索文件, 返回文件的绝对路径
        for path in start_dir.rglob(f'{file_name}'):
            return path.resolve()  # 返回完整路径
        return None  # 如果没有找到文件，返回None

    @staticmethod
    def yaml_data(fpath):
        """读取yaml文件并返回获取的内容"""
        with open(f'{fpath}', 'r', encoding='utf-8') as f:
            print("\n配置文件位置: ", fpath)
            fdata = yaml.safe_load(f)
            # 测试数据
            # datalist = fdata['data']
            # print(datalist['username'], datalist['password'])
            # print(fdata['data']['username'])
            # path = fdata['url']
            # print(path)
            return fdata


class Tools:
    """工具类"""

    def __init__(self):
        """初始化变量
            从配置文件里获取用户名、密码、路径、打开浏览器
            创建webdriver实例
        """
        self.parent_element = None
        self.driver = None

    def open_page(self, data, my_browser=MARK):
        """打开网页
            从配置文件中获取浏览器, 以及网页, 打开网页
        """
        # 从配置文件中获取数据
        init_list = data['initMsg']
        # url就只用默认值
        url = init_list['url']

        # 如果自己添加了数据, 则使用自己添加的数据, 如果没有添加数据就默认使用配置文件里的数据
        if my_browser == MARK:
            browser = init_list['browser']
        else:
            browser = my_browser

        # 通过browser进行判断, 生成不同的webdriver实例
        match browser:
            case 'Chrome':
                self.driver = webdriver.Chrome()
            case 'Firefox':
                self.driver = webdriver.Firefox()
            case 'Edge':
                self.driver = webdriver.Edge()
            case _:
                raise TypeError('配置文件错误')

        # 打开网页
        self.driver.get(url)
        self.driver.implicitly_wait(10)

    def login(self, data=None, user_id=MARK, password=MARK):
        """登录功能
            1.
            2. 输入用户名和密码
            3. 关闭提示信息
        """
        # 初始化准备
        datalist = None
        driver = self.driver

        if data is not None:
            # 给变量赋值
            datalist = data['data']
        # 用户名和密码有参数传递进来就赋值, 若没有传参则用data.yaml里的默认值
        if user_id == MARK:
            username = datalist['username']
        else:
            username = user_id
        if password == MARK:
            pwd = datalist['password']
        else:
            pwd = password

        if username:
            # 输入用户名
            driver.find_element(By.NAME, "loginId").send_keys(username)
        if password:
            # 密码
            driver.find_element(By.NAME, "password").send_keys(pwd)
        actions = ActionChains(driver)
        actions.send_keys(Keys.ENTER).perform()

    def close_msg(self):
        """关闭弹窗"""
        driver = self.driver
        time.sleep(3)
        # 等待提示信息出现并关闭
        driver.find_element(By.XPATH, '//*[@id="msg_close"]').click()
        # WebDriverWait(driver, 10).until(
        #     EC.presence_of_element_located((By.XPATH, '//*[@id="msg_close"]'))
        # ).click()

    def select(self, option, value):
        """选择测试模块:
            1. 协同办公
            2. 公共信息
            3. 文档管理
            4. 电子邮件
            5. 工作记录
        """
        driver = self.driver
        # 查询到左侧菜单
        self.parent_element = driver.find_element(By.XPATH, '//div[@id="leftmenuDiv"]')
        try:
            if option > 5 | option < 0:
                raise ValueError("值错误")
        except ValueError as e:
            print(e)
        path = f'//h3[{option}]'
        ele = self.parent_element.find_element(By.XPATH, path)
        ele.click()
        self.check_item(option, value)

    def check_item(self, option, value):
        """选择不同测试模块里的内容"""
        num = 2 + (value - 1) * 3
        # 路径字典,这里用的是Xpath方法的路径
        path = f'div[{option}]//tr[{num}]//a'
        self.parent_element.find_element(By.XPATH, path).click()


class PreStep:
    def __init__(self):
        self.driver = None

    def pre_step(self, option, value):
        """家红大佬的建议, 实现调用一个方法实现登录和选择自己所需模块这两个操作"""
        # 先创建工具类的实例
        tools = Tools()
        # 获取tools的driver属性
        self.driver = tools.driver

        # 获取文件路径
        file_path = QueryFile.find_path()

        # 读取yaml文件内容
        data = QueryFile.yaml_data(file_path)

        # 由于不是登录校验, 打开页面操作和登录操作都是用的默认参数
        tools.open_page(data)
        tools.login(data)
        # 关闭信息弹窗
        tools.close_msg()

        # 选择自己所属模块
        tools.select(option, value)


'''结束'''

# todo 陈诗琪编写工具区域
'''开始'''

'''结束'''

if __name__ == '__main__':
    # 说明, 进入登录并且选择自己的页面可以直接用Preset()方法，示例如下
    p = PreStep()
    p.pre_step(2, 1)
    driver = p.driver
